package it.unisa.unibox.gestioneProdotti;


import it.unisa.unibox.beans.Monografia;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.commons.DBConstants;
import it.unisa.unibox.commons.DBNames;
import it.unisa.unibox.commons.XMLParser;
import it.unisa.unibox.facade.FacadeProdotti;
import it.unisa.unibox.facade.IFacadeProdotti;
import it.unisa.unibox.otherServlets.UtilityFunctions;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * Servlet implementation class LoginServlet
 */
public class InserisciMonografiaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public static ServletContext servletContext;

	
	private String filePath;
	    

	public static IFacadeProdotti facade;


	public InserisciMonografiaServlet() {
		super();
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
			filePath = servletContext.getRealPath("files");
			facade = new FacadeProdotti();

		} 

		catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doPost(request,response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		int stato = -1;
		int idProdotto=0;
		
		Monografia prodotto = creaBean(request);
		if(prodotto!=null){
				
				if(facade.checkConflitto(0,request.getParameter(DBNames.ATT_PRODOTTO_TITOLO), 
						request.getParameter(DBNames.ATT_PRODOTTO_TIPOLOGIA), 
						Integer.parseInt(request.getParameter(DBNames.ATT_PRODOTTO_ANNO)),
						request.getParameter(DBNames.ATT_PRODOTTO_URL))){
					
						stato = 0;
						System.out.println("conflitto trovato");
				}
				
	
				idProdotto = facade.inserisciProdotto(prodotto);	
	
				String autori = request.getParameter("autori");
				
				System.out.println("autori prima: \n"+ autori);
				ArrayList<Integer> lista = UtilityFunctions.mySplit(autori);
				System.out.println("autori dopo: \n"+ lista.toString());
				Ricercatore rc = (Ricercatore) request.getSession().getAttribute("ricercatore");
		
				if(facade.aggiornaListaAutori(idProdotto, lista, rc.getId())){
					if(stato != 0)
						stato = 1;
				}
				else
					stato = -1;
			}
		else{
			stato = -1;
		}
		
		System.out.println("id"+idProdotto+" stato"+stato);
		Document doc = XMLParser.rispostaInserimento(idProdotto, stato);
		XMLOutputter xml_out = new XMLOutputter();
		xml_out.setFormat(Format.getPrettyFormat());
		response.setContentType("text/xml");
		response.setHeader("Cache-Control",	"no-store, no-cache, must-revalidate");     
		PrintWriter out = response.getWriter(); 
		// test --> xml_out.output(doc, new FileOutputStream(new File("prova.xml")));
		xml_out.output(doc, out);
			
	}

	protected Monografia creaBean(HttpServletRequest request){


		Monografia p = null;

		
		String titolo = request.getParameter(DBNames.ATT_PRODOTTO_TITOLO);
		String abstract_field = request.getParameter("abstract_field");
		int anno = 	Integer.parseInt(request.getParameter(DBNames.ATT_PRODOTTO_ANNO));
		String lingua = request.getParameter(DBNames.ATT_PRODOTTO_LINGUA);  
		String url = request.getParameter(DBNames.ATT_PRODOTTO_URL); 
		String note = ""; 
		
		String tipologia = request.getParameter(DBNames.ATT_PRODOTTO_TIPOLOGIA);
		int stato = request.getParameter(DBNames.ATT_PRODOTTO_STATO)==null ? DBConstants.PRODOTTO_STATO_DRAFT : DBConstants.PRODOTTO_STATO_COMPLETO;
		int pubblico = request.getParameter(DBNames.ATT_PRODOTTO_PUBBLICO).equalsIgnoreCase("si") ? DBConstants.PRODOTTO_DOMINIO_PUBBLICO : DBConstants.PRODOTTO_DOMINIO_PRIVATO;
		System.out.println("->>>> "+request.getParameter(DBNames.ATT_PRODOTTO_ANNO));

		String volume = request.getParameter("volume");  
		String argomento = request.getParameter("argomento");  
		
		if(!UtilityFunctions.controllaCampi(titolo, abstract_field, anno, lingua, url) 
				|| !controllaCampiMonografia(volume,argomento))
			return p;
		else
				p = new Monografia(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						tipologia,
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						Integer.parseInt(volume),
						argomento); 
		
		System.out.println(p);
	
		return p;
	}
	
	
		
	private static boolean controllaCampiMonografia(String volume, String argomento){
		try{
			int vol = Integer.parseInt(volume);
		}catch(NumberFormatException e){
			System.out.println("volume");
			return false;
		}
		
		if(Integer.parseInt(volume) < 0 || Integer.parseInt(volume) >= 999 || volume.equals("")
			 || argomento.length() < 6 || argomento.length() > 35 || argomento.equals("") )
			return false;
		
		return true;
	}
}
